package com.time.client.application.controller;

import com.google.common.base.Preconditions;
import com.time.auth.entity.Result;
import com.time.client.application.converter.FriendLinkDTOConverter;
import com.time.client.application.dto.FriendLinkDTO;
import com.time.client.common.entity.PageResult;
import com.time.client.domain.entity.FriendLinkBO;
import com.time.client.domain.service.ClientFriendLinkDomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 友链客户端控制层类
 *
 * @author: HuangQi
 * @date: Created in 16:13 2025/10/31
 * @description: 友链客户端控制层
 */
@Slf4j
@RestController
@RequestMapping("/client/friendLink/")
public class FriendLinkController {

    @Autowired
    private ClientFriendLinkDomainService clientFriendLinkDomainService;

    /**
     * 申请友链
     *
     * @param friendLinkDTO 新增友链信息
     * @return 申请结果
     */
    @PostMapping("add")
    public Result<Boolean> add(@RequestBody FriendLinkDTO friendLinkDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.FriendLinkController.add.dto:{}", friendLinkDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(friendLinkDTO.getLinkName(), "友链的名称不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getLinkUrl(), "友链的链接不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getDescription(), "友链的描述不能为空");
            Preconditions.checkNotNull(friendLinkDTO.getCategory(), "友链的分类不能为空");

            // 调用领域层
            FriendLinkBO friendLinkBO = FriendLinkDTOConverter.INSTANCE.convertDTOToBO(friendLinkDTO);
            Boolean addResult = clientFriendLinkDomainService.add(friendLinkBO);

            // 返回结果
            return Result.ok(addResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Client.FriendLinkController.add.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块申请友链失败");
        }
    }

    /**
     * 分页查询所有友链
     *
     * @param friendLinkDTO 分页查询所有友链信息
     * @return 分页友链信息结果
     */
    @PostMapping("queryAll")
    public Result<PageResult<FriendLinkDTO>> queryAllFriendLink(@RequestBody FriendLinkDTO friendLinkDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.FriendLinkController.queryAllFriendLink.dto: {}", friendLinkDTO);
            }

            // 调用领域层
            FriendLinkBO friendLinkBO = FriendLinkDTOConverter.INSTANCE.convertDTOToBO(friendLinkDTO);
            PageResult<FriendLinkBO> infoBOPageResult = clientFriendLinkDomainService.queryAllFriendLink(friendLinkBO);

            // 返回结果
            PageResult<FriendLinkDTO> infoDTOPageResult = FriendLinkDTOConverter.INSTANCE.convertBOPageToDTOPage(infoBOPageResult);
            return Result.ok(infoDTOPageResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Client.FriendLinkController.queryAllFriendLink.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块分页获取所有友链失败");
        }
    }

    /**
     * 获取友链的所有分类名称
     *
     * @return 友链分类名称列表
     */
    @PostMapping()
    public Result<List<String>> queryAllFriendLinkCategory() {
        try {
            if (log.isInfoEnabled()) {
                log.info("Client.FriendLinkController.queryAllFriendLinkCategory");
            }

            // 调用领域层
            List<String> categoryNameList = clientFriendLinkDomainService.queryAllFriendLinkCategory();
            return Result.ok(categoryNameList);
        } catch (Exception e) {
            // 异常处理
            log.error("Client.FriendLinkController.queryAllFriendLinkCategory.error:{}", e.getMessage(), e);
            return Result.fail("客户端模块分页获取友链所有分类失败");
        }
    }

}
